package com.ruoyi.framework.web.service;

import com.anji.captcha.model.common.ResponseModel;
import com.anji.captcha.model.vo.CaptchaVO;
import com.anji.captcha.service.CaptchaService;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.exception.CustomException;
import com.ruoyi.common.exception.user.CaptchaException;
import com.ruoyi.common.exception.user.CaptchaExpireException;
import com.ruoyi.common.exception.user.UserPasswordNotMatchException;
import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.framework.manager.AsyncManager;
import com.ruoyi.framework.manager.factory.AsyncFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * 登录校验方法
 *
 * @author ruoyi
 */
@Component
public class SysLoginService {
	@Autowired
	private TokenService tokenService;

	@Resource
	private AuthenticationManager authenticationManager;
	@Autowired
	@Lazy
	private CaptchaService captchaService;
	/**
	 * 登录验证
	 *
	 * @param username 用户名
	 * @param password 密码
	 * @param code 验证码
	 * @return 结果
	 */
	public String login( String username , String password , String code) {
		CaptchaVO captchaVO = new CaptchaVO();
		captchaVO.setCaptchaVerification(code);
		ResponseModel response = captchaService.verification(captchaVO);
		if (!response.isSuccess()) {
			AsyncManager.me().execute(AsyncFactory
					.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));
			throw new CaptchaException();
		}
		// 用户验证
		Authentication authentication = null;
		try {
			// 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
			authentication = authenticationManager.authenticate( new UsernamePasswordAuthenticationToken( username ,
                    password ) );
		} catch ( Exception e ) {
			if ( e instanceof BadCredentialsException ) {
				AsyncManager.me().execute( AsyncFactory.recordLogininfor( username , Constants.LOGIN_FAIL ,
                        MessageUtils.message( "user.password.not.match" ) ) );
				throw new UserPasswordNotMatchException();
			}
			else {
				AsyncManager.me().execute( AsyncFactory.recordLogininfor( username , Constants.LOGIN_FAIL ,
                        e.getMessage() ) );
				throw new CustomException( e.getMessage() );
			}
		}
		AsyncManager.me().execute( AsyncFactory.recordLogininfor( username , Constants.LOGIN_SUCCESS ,
                MessageUtils.message( "user.login.success" ) ) );
		LoginUser loginUser = ( LoginUser ) authentication.getPrincipal();
		// 生成token
		return tokenService.createToken( loginUser );
	}

	public String outLogin( String username , String password ) {
		//        String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
		//        String captcha = redisCache.getCacheObject(verifyKey);
		//        redisCache.deleteObject(verifyKey);
		//        if (captcha == null)
		//        {
		//            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL,
        //            MessageUtils.message("user.jcaptcha.expire")));
		//            throw new CaptchaExpireException();
		//        }
		//        if (!code.equalsIgnoreCase(captcha))
		//        {
		//            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL,
        //            MessageUtils.message("user.jcaptcha.error")));
		//            throw new CaptchaException();
		//        }
		// 用户验证
		Authentication authentication = null;
		try {
			// 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
			authentication = authenticationManager.authenticate( new UsernamePasswordAuthenticationToken( username ,
                    password ) );
		} catch ( Exception e ) {
			if ( e instanceof BadCredentialsException ) {
				AsyncManager.me().execute( AsyncFactory.recordLogininfor( username , Constants.LOGIN_FAIL ,
                        MessageUtils.message( "user.password.not.match" ) ) );
				throw new UserPasswordNotMatchException();
			}
			else {
				AsyncManager.me().execute( AsyncFactory.recordLogininfor( username , Constants.LOGIN_FAIL ,
                        e.getMessage() ) );
				throw new CustomException( e.getMessage() );
			}
		}
		AsyncManager.me().execute( AsyncFactory.recordLogininfor( username , Constants.LOGIN_SUCCESS ,
                MessageUtils.message( "user.login.success" ) ) );
		LoginUser loginUser = ( LoginUser ) authentication.getPrincipal();
		// 生成token
		return tokenService.createToken( loginUser );
	}
}
